﻿#ifndef BDPCCODEC_GLOBAL_H
#define BDPCCODEC_GLOBAL_H


#include <iostream>
#include <stdint.h>
#include <string.h>

using namespace std;


#ifndef  _H_SN_TYPE_
#define  _H_SN_TYPE_
typedef  char                   i1;
typedef  short                  i2;
typedef  int                    i4;
typedef  long long              i8;
typedef  unsigned char          u1;
typedef  unsigned short         u2;
typedef  unsigned int           u4;
typedef  unsigned long long     u8;
typedef  float                  f4;
typedef  double                 f8;
#endif

#ifndef  _H_SN_ENUM_
#define  _H_SN_ENUM_
enum ESYSTEM
{
  SYSTEM_NONE,
  SYSTEM_BD2,  //!< 北斗二号
  SYSTEM_BD3,  //!< 北斗三号
  SYSTEM_GPS,  //!< GPS
  SYSTEM_GLO,  //!< Glonass
  SYSTEM_GAL,  //!< Galileo
  SYSTEM_MAX
};

//!< 频点
enum EFREQUENCY_BAND
{
  FREQUENCY_BAND_NONE = 0,
  FREQUENCY_BAND_B1I,
  FREQUENCY_BAND_B1C,
  FREQUENCY_BAND_B1C_SBAS,
  FREQUENCY_BAND_B1A,
  FREQUENCY_BAND_B1A_SBAS,
  FREQUENCY_BAND_B2a,
  FREQUENCY_BAND_B2a_SBAS,
  FREQUENCY_BAND_B2b,
  FREQUENCY_BAND_B2b_PPP,
  FREQUENCY_BAND_B3I,
  FREQUENCY_BAND_B3D,   //!< 模拟卫星加注
  FREQUENCY_BAND_B3Q,
  FREQUENCY_BAND_B3A,
  FREQUENCY_BAND_B3AE,
  FREQUENCY_BAND_S2C,
  FREQUENCY_BAND_S2A,
  FREQUENCY_BAND_L1I,
  FREQUENCY_BAND_G1I,
  FREQUENCY_BAND_E1OS,
  FREQUENCY_BAND_S1,
  FREQUENCY_BAND_MAX
};
#endif


//!< 通信数据的最大长度(汉字:1000;代码:3500;混编:1750)
const u4 MAX_BDMSG_LEN = 3500;
//!< 北斗标准指令数据的最小长度
const u4 MIN_BDCHBCMD_LEN = 10;
//!< 最大用户组数
const u4 MAX_USERGROUP_NUM = 200;
//!< 卫星的最多颗数
const u4 MAX_SATELLITE_NUM = 64;
//!< 同时可见的卫星的最多颗数
const u4 MAX_SATELLITE_TIME_NUM = 21;

extern int g_iSecretTestSwitch;

#pragma pack(push)  //!< 保存字节对齐状态
#pragma pack(1)     //!< 按照1字节对齐

//!< 北斗协议
typedef enum _E_BDPROTOCOL_
{
  E_BDPROTOCOL_UNKNOW= 0,
  E_BDPROTOCOL_ICR,
  E_BDPROTOCOL_ICP,
  E_BDPROTOCOL_ICZ,
  E_BDPROTOCOL_TCQ,
  E_BDPROTOCOL_TCI   = 5,
  E_BDPROTOCOL_GGA,
  E_BDPROTOCOL_GSV,
  E_BDPROTOCOL_GSA,
  E_BDPROTOCOL_PWI,
  E_BDPROTOCOL_ZDA,
  E_BDPROTOCOL_SNP,
  E_BDPROTOCOL_GXP,
  E_BDPROTOCOL_ERQ,
  E_BDPROTOCOL_EPI,
  E_BDPROTOCOL_ZHS,
  E_BDPROTOCOL_ZFI,
  E_BDPROTOCOL_COV,
  E_BDPROTOCOL_MAX
} E_BDPROTOCOL;
//!< 北斗系统类别枚举
typedef enum
{
  E_BDUART_UNKNOW     = 0,
  E_BDUART_BDII       = 6,
  E_BDUART_BDIII      = 15,
  E_BDUART_MAX
} E_BDUART;
//!< 卫星系统类别
typedef enum
{
  E_SATELLITESYS_UNKNOEN=0,
  E_SATELLITESYS_BD,  //!< 北斗系统
  E_SATELLITESYS_GP,  //!< GPS系统
  E_SATELLITESYS_GL,  //!< GLONASS系统
  E_SATELLITESYS_GA,  //!< Galieo系统
  E_SATELLITESYS_GN,  //!< 兼容多系统
  E_SATELLITESYS_MAX
} E_SATELLITESYS;
//!< 通信数据编码格式
typedef enum
{
  E_BDMSGCODING_UNKNOEN=0,
  E_BDMSGCODING_WORD, //!< 汉字
  E_BDMSGCODING_CODE, //!< 代码
  E_BDMSGCODING_MIX,  //!< 混编
  E_BDMSGCODING_MAX
} E_BDMSGCODING;
//!< ICP的用户标识字段
typedef enum _E_DBIPCUSERFLAG_
{
  E_DBIPCUSERFLAG_UNKNOW    = 0,  //!< 无卡
  E_DBIPCUSERFLAG_BDI,            //!< 北斗一号用户
  E_DBIPCUSERFLAG_BDII,           //!< 北斗二号用户
  E_DBIPCUSERFLAG_BDIII,          //!< 北斗三号用户
} E_DBIPCUSERFLAG;
//!< 入站频点
typedef enum _E_BDINBOUNDFREQ_
{
  E_BDINBOUNDFREQ_ADAPTIVE  = 0,  //!< 自适应
  E_BDINBOUNDFREQ_LF0       = 1,
  E_BDINBOUNDFREQ_LF1,
  E_BDINBOUNDFREQ_LF2,
  E_BDINBOUNDFREQ_LF3,
  E_BDINBOUNDFREQ_LF4,
} E_BDINBOUNDFREQ;

#ifndef  _H_SN_TBDRSDATA_
#define  _H_SN_TBDRSDATA_
//! 串口收发数据的最大长度
const u4 MAX_BDRS_LEN = (1024*16);
//!< 串口/网口数据
typedef struct _T_BDRSDATA_
{
  char    sData[MAX_BDRS_LEN];    //!< 数据内容
  u4      uLen;                   //!< 数据长度
  _T_BDRSDATA_ ()
  {
    memset(sData, 0x00, sizeof(sData));
    uLen  = 0;
  }
} T_BDRSDATA;
#endif

//!< ICR
typedef struct _T_BDICRDATA_
{
  u1      uType;      //!< 检测指令类型 0本机加密模块；1本机编组信息；2具备指挥功能终端的下属用户；3保密模块工作模式
  u1      uSubUser;   //!< 下属用户信息帧 指令类型为3时，值为00

  _T_BDICRDATA_ ()
  {
    uType     = 0;
    uSubUser  = 0;
  }
} T_BDICRDATA;

//!< ICP
typedef struct _T_BDICPDATA_
{
  u8  uUserID;        //!< 用户地址
  u8  uBroadcastID;   //!< 通播地址 普通型和兼收型为0
  u4  uAuthType;      //!< 授启类型 0为非授启；1为授启
  E_DBIPCUSERFLAG  eUserFlag; //!< 用户标识 1为北斗一号用户；2为北斗二号用户；3为北斗三号用户。
  u4  uUserFeatures;  //!< (BDII)用户特征值
  u4  uServer;        //!< 启用暂停服务标记 0为服务启用；1为服务暂停
  u4  uSecrecy;       //!< 保密标识 E(0)为加密；N(1)为非密。 加密标记(BDII)
  u4  uTerminalType;  //!< 终端类型 1为指挥型；2为兼收型；3为普通型；
  u4  uSearch;        //!< 搜救标识 Y(0)为搜救用户；N(1)为非搜救用户
  u4  uJMFlag;        //!< 军/民标识 0为军用；1为民用
  u4  uInteraction;   //!< 军民交互权限 0为无此权限；1有此权限
  u4  uCountry;       //!< 我国/友国标识 0为我国；1为友国
  u4  uUserPriorty;   //!< 用户优先级 1为特级；2为高级；3为普通
  u4  uRDServer;      //!< RD区域服务能力标识 0为无此权限；1有此权限
  u4  uFreq;          //!< RDSS服务频度 单位：秒。 服务频度(BDII)
  u4  uRDSSLevel;     //!< RDSS通信长度等级 取值:1~5。 服务等级:1~4(BDII)
  u4  uGlobalFlag;    //!< 全球标识 全球短报文服务权限
  u4  uGlobalMiniMsg; //!< 全球短报文交互权限 0为无此权限；1有此权限
  u4  uGlobalFreq;    //!< 全球短报文服务频度 单位：秒
  u4  uGlobalLevel;   //!< 全球短报文通信长度等级 取值:1~2
  u4  uSubUserNum;    //!< 下属用户数 普通用户时为0
  u4  uGroupAuth;     //!< 编组权限 标识用户机是否有建群资格，指挥型的可建群数量的上限为100，其它类型为10
  u4  uCreateGroupNum;//!< 自建组数
  u4  uAddCreateNum;  //!< 加入组数量

  _T_BDICPDATA_()
  {
      uUserID           = 0;
      uBroadcastID 	= 0;
      uAuthType         = 0;
      eUserFlag         = E_DBIPCUSERFLAG_UNKNOW;
      uUserFeatures	= 0;
      uServer		= 0;
      uSecrecy		= 0;
      uTerminalType	= 0;
      uSearch		= 0;
      uJMFlag		= 0;
      uInteraction	= 0;
      uCountry		= 0;
      uUserPriorty	= 0;
      uRDServer		= 0;
      uFreq		= 0;
      uRDSSLevel	= 0;
      uGlobalFlag	= 0;
      uGlobalMiniMsg    = 0;
      uGlobalFreq	= 0;
      uGlobalLevel	= 0;
      uSubUserNum	= 0;
      uGroupAuth	= 0;
      uCreateGroupNum	= 0;
      uAddCreateNum	= 0;
  }
} T_BDICPDATA;

//!< ICZ
typedef struct _T_BDICZDATA_
{
  u4    uSubUserNum;        //!< 下属用户数(本条信息包含的用户数)
  u8    uSubUserID[128];    //!< 下属用户ID
  bool  uIsBDIIIUser[128];//!< 是否为北斗三号用户 Y(true)为三号用户 BDII没有此字段
} T_BDICZDATA;

//!< TBQ
typedef struct _T_BDTBQDATA_
{
  u8    uDestID;        //!< 通播ID
  E_BDINBOUNDFREQ   eInboudFreq;    //!< 频点 1~5:Lf0~Lf4

  u4    uAreaFalg;      //!< 区域指示 0-区域；1-全球 TBQ字段
  u4		uSate;          //!< 卫星号
  u4		uBeam;          //!< 波束号
  u4	  uLon;           //!< 出站范围中心经度 0~180 单位：角度
  i1    cLonFlag;       //!< 出站经度标志 E/W
  u4	  uLat;           //!< 出站范围中心纬度 0~90 单位：角度
  i1    cLatFlag;       //!< 出站纬度标志 N/S
  u4	  uRadius;        //!< 出站半径 0~20 单位：0.5角度

  E_BDMSGCODING     eCoding; //!< 编码类型 1-汉字;2-代码;3-混编
  u4    uMsgLen;        //!< 通信数据的长度
  char  sMsg[MAX_BDMSG_LEN];  //!< 通信数据
  u4    uMsgFreq;       //!< 报文通信频度 0为单次，关闭连续在RMO中关闭

  _T_BDTBQDATA_ ()
  {
    uDestID     = 0;
    eInboudFreq = E_BDINBOUNDFREQ_ADAPTIVE;

    uAreaFalg   = 0;
    uSate       = 0;
    uBeam       = 0;
    uLon        = 0;
    cLonFlag    = 'E';
    uLat        = 0;
    cLatFlag    = 'N';
    uRadius     = 0;

    eCoding     = E_BDMSGCODING_CODE;
    memset(sMsg, 0x00, sizeof(sMsg));
    uMsgLen     = 0;
    uMsgFreq    = 0;
  }
} T_BDTBQDATA;

//!< TCQ（TXA）
typedef struct _T_BDTCQDATA_
{
  u8    uDestID;        //!< 收信方ID
  E_BDINBOUNDFREQ   eInboudFreq;    //!< 频点 1~5:Lf0~Lf4
  u4    uInboudReq;     //!< 入站确认申请 1-不需确认；2-需确认
  E_BDMSGCODING     eCoding; //!< 编码类型 1-汉字;2-代码;3-混编
  u4    uMsgLen;        //!< 通信数据的长度
  char  sMsg[MAX_BDMSG_LEN];  //!< 通信数据
  u4    uMsgFreq;       //!< 报文通信频度 0为单次，关闭连续在RMO中关闭

  _T_BDTCQDATA_ ()
  {
    uDestID     = 0;
    eInboudFreq = E_BDINBOUNDFREQ_ADAPTIVE;
    uInboudReq  = 1;
    eCoding     = E_BDMSGCODING_CODE;
    memset(sMsg, 0x00, sizeof(sMsg));
    uMsgLen     = 0;
    uMsgFreq    = 0;
  }
} T_BDTCQDATA;

//!< TCI（TXR）
typedef struct _T_BDTCIDATA_
{
  u8  uSrcID;         //!< 发信方ID   发送用户地址（BDII）
  u8  uDestID;        //!< 收信方ID
  u4  uFreq;          //!< 频点 1-S1;2-S2C;3-S2A;4-B2b
  u1  uHour;          //!< 时 UTC时（东八区）
  u1  uMin;           //!< 分 UTC时（东八区）
  u1  uSec;           //!< 秒 UTC时（东八区）
  u1  uFlag;          //! 数据标识 0-即时；1-邮箱
  E_BDMSGCODING  eCoding; //!< 编码类型 1-汉字;2-代码;3-混编  传输方式（BDII）
  i4  uMsgLen;        //!< 通信数据的长度
  char    sMsg[MAX_BDMSG_LEN];  //!< 通信数据

  _T_BDTCIDATA_ ()
  {
    memset(sMsg, 0x00, sizeof(sMsg));
    uMsgLen = 0;
  }
} T_BDTCIDATA;

//!< GGA
typedef struct _T_BDGGADATA_
{
  char sData[MAX_BDRS_LEN];    //! 数据内容
  E_SATELLITESYS  eSys;//!< 卫星系统
  u1  uHour;          //!< 时 UTC时（东八区）
  u1  uMin;           //!< 分 UTC时（东八区）
  u1  uSec;           //!< 秒 UTC时（东八区）
  u1  u001Sec;        //!< 0.01秒 UTC时
  f8  fLat;           //!< 纬度
  u4  uLatPath;       //!< 纬度方向 N(0)-北纬；S(1)-南纬
  f8  fLon;           //!< 经度
  u4  uLonPath;       //!< 经度方向 E(0)-东经；W(1)-西经
  u4  uStatus;        //!< 状态指示 0~7
  u4  uSatelliteSum;  //!< 参与定位卫星颗数
  f8  fHDOP;          //!< HDOP值
  f8  fHeight;        //!< 天线大地高
  u4  uHeightUnit;    //!< 天线大地高单位：米
  f8  fHeightAbn;     //!< CGS-2000高程异常
  u4  uHeightAbnUnit; //!< 高程异常单位：米
  u4  uAge;           //!< 差分数据龄期
  u4  uSiteID;        //!< 差分站台ID号
  f8  fVDOP;          //!< VDOP值
} T_BDGGADATA;

//!< MSS
typedef struct _T_BDMSSFREQDATA_
{
  char    sFreq[8];   //!< 频率
  u1      cChannel;   //!< 支路。C/P/A，BDIII时为空

  _T_BDMSSFREQDATA_()
  {
    memset(sFreq, 0x00, sizeof(sFreq));
    cChannel = 0;
  }
} T_BDMSSFREQDATA;
typedef struct _T_BDMSSDATA_
{
  u1  uWorkMode;      //!< 工作模式 C(0)-测试模式；Z(1)-正常模式
  u1  uItem;          //!< 定位模式/测试项目 0~9为A~F
  T_BDMSSFREQDATA tFreq[6];//!< 频率/支路
} T_BDMSSDATA;

//!< EPQ (RD 应急搜救和定位报告 输出)
typedef struct _T_BDEPQDATA_
{
  u8  uDestID;        //!< 收信方ID
  u1  uMode;          //!< 定位报告模式 1~5 1-RDSS定位报告(无测高)；2-RDSS定位报告(有测高)；3-广义RDSS定位报告；4-普通位置报告；5-自适应
  E_BDINBOUNDFREQ   eInboudFreq;          //!< 入站频点 0~5 0-自适应频点；1~5 - LF0~LF4
  u1  uSpeed;         //!< 入站速率 1~4
  u1  uType;          //!< 紧急标识 1~3 1-应急搜救；2-标准定位报告(高程值为空)；3-解密定位报告(高程值、搜救类型为空)
  i4  iAltitude;      //!< 高程值 米 可负可正
  u1  uSarType;       //!< 搜救类型 1~3 1-呼救申请；2-呼救取消；3-前向身份鉴别
  u1  uInterval;      //!< 频度 秒
  u1  uPower;         //!< 入站功率 0~100 单位为0.5dB
  u4  uBitLength;     //!< 搜救业务数据或状态数据的bit数
  u1  uBitData[256];  //!< 搜救业务数据或状态数据
} T_BDEPQDATA;

//!< EPI (RD 应急搜救和定位报告)
typedef struct _T_BDEPIDATA_
{
  u8  uSrcID;         //!< 发信方ID
  u8  uDestID;        //!< 收信方ID
  u1  uFreq;          //!< 接收频点 1~3 1-S1;2-S2C;3-预留;4-B2b
  u1  uType;          //!< 紧急标识 1~3 1-应急搜救；2-标准定位报告(高程、高程异常、高程异常单位不为空)；3-解密定位报告
  u1  uMode;          //!< 定位报告模式 1~4 1-RDSS定位报告；2-广义RDSS定位报告；3-普通位置报告；4-搜救中心指示代码
  u1  uHour;          //!< 时 UTC时
  u1  uMin;           //!< 分 UTC时
  u1  uSec;           //!< 秒 UTC时
  u1  u001Sec;        //!< 0.01秒 UTC时
  f8  fLon;           //!< 经度
  u4  uLonPath;       //!< 经度方向 E(0)-东经；W(1)-西经
  f8  fLat;           //!< 纬度
  u4  uLatPath;       //!< 纬度方向 N(0)-北纬；S(1)-南纬
  f8  fHeight;        //!< 高程 单位：米
  u4  uHeightUnit;    //!< 高程单位：M
  f8  fHeightAbn;     //!< 高程异常 单位：米
  u4  uHeightAbnUnit; //!< 高程异常单位：M
  u4  uPre;           //!< 精度指示 1~2
  u1  uMultiValue;    //!< 多值解 1~2
  u1  uSubType;       //!< 搜救业务子类型 1~4
  u1  uIndicateType;  //!< 搜救中心指示类型 1~4 1-呼救回执；2-入站发射控制指令；3-返回身份鉴别；4-呼救唤醒
  u4  uBitLength;     //!< 搜救业务数据或状态数据的bit数
  u1  uBitData[256];  //!< 搜救业务数据或状态数据
} T_BDEPIDATA;


typedef int (*pDecoderCallBackFunc)(void *pDest);
typedef struct _T_DECODERCALLBACKFUNC_
{
  pDecoderCallBackFunc pFunc;
} T_DECODERCALLBACKFUNC;

#pragma pack(pop)   //!< 恢复字节对齐状态


#endif // BDPCCODEC_GLOBAL_H
